package net.xdclass.shopproject.processor;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;

/**
 * BeanFactoryPostProcessor
 *  Spring框架中一个重要的扩展接口，可以在spring的bean创建之前，可以修改Bean定义属性，注入第三方数据等
 *  在Spring容器加载定义bean的XML文件之后，在bean实例化之前执行的
 *  在BeanFactory初始化时执行，它的执行顺序是在BeanFactory的后置处理器（BeanPostProcessor）之前
 *  BeanFactoryPostProcessor接口的实现类必须由开发人员自行编写，并在Spring的配置文件中配置对应的Bean实例
 *
 *  作用
 *      读取应用程序上下文（ApplicationContext）中的所有Bean定义
 *      修改定义中的属性值等信息
 *      对修改后的定义进行处理，使其达到预期效果
 *      将修改后的Bean定义反馈到容器中，容器将重新执行Bean创建和初始化的过程
 */
public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

    public CustomBeanFactoryPostProcessor() {
        System.out.println("CustomFactoryPostProcessor--------------构造函数执行");
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        String[] beanDefinitionNames = beanFactory.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            if ("productService".equals(beanDefinitionName)) {
                BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanDefinitionName);
                beanDefinition.setScope(ConfigurableBeanFactory.SCOPE_PROTOTYPE);
                beanDefinition.setInitMethodName("testInit");
                System.out.println("productService被修改成多例");
            }
        }
    }

}
